package cn.rengy.tpa.wxmp.material;



import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import cn.rengy.tool.http.HttpUtils;
import cn.rengy.tpa.wxmp.exception.WeChatException;
import cn.rengy.tpa.wxmp.token.AccessToken;
import cn.rengy.tpa.wxmp.util.WeChatUtil;
/**
 * 素材管理
 * 	1、最近更新：永久图片素材新增后，将带有URL返回给开发者，开发者可以在腾讯系域名内使用（腾讯系域名外使用，图片将被屏蔽）。
	2、公众号的素材库保存总数量有上限：图文消息素材、图片素材上限为5000，其他类型为1000。
	3、素材的格式大小等要求与公众平台官网一致：
	图片（image）: 2M，支持bmp/png/jpeg/jpg/gif格式
	语音（voice）：2M，播放长度不超过60s，mp3/wma/wav/amr格式
	视频（video）：10MB，支持MP4格式
	缩略图（thumb）：64KB，支持JPG格式
	4、图文消息的具体内容中，微信后台将过滤外部的图片链接，图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。
	5、"上传图文消息内的图片获取URL"接口所上传的图片，不占用公众号的素材库中图片数量的5000个的限制，图片仅支持jpg/png格式，大小必须在1MB以下。
	6、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。
 * @author rengy
 * @version 2016-6-21
 */
public class MaterialManager {
	private static Logger logger = LoggerFactory.getLogger(MaterialManager.class);
	/**获取素材列表url**/
	private static final String MATERIAL_LIST_URL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=";
	private static final String DOWNLOAD_URL ="http://file.api.weixin.qq.com/cgi-bin/media/get?";
	private static final String MATERIALCOUNT_URL = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=";
	
	/**新增永久图文素材**/
	private static final String ADD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=";
	/**上传图文消息内的图片获取URL**/
	private static final String UPLOADIMG_URL ="https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=";
	private final int retry=2;
	private AccessToken accessToken;
	private static final String PARAM_FILE = "media";
	public static final String TYPE_IMAGE="image";
	public static final String TYPE_VIDEO="video";
	public static final String TYPE_VOICE="voice";
	public static final String TYPE_NEWS="news";
	public MaterialManager(AccessToken accessToken) {
		this.accessToken = accessToken;
	}
	/**
	 * 新增永久图文素材
	 * @throws WeChatException 
	 */
	public String addNews(Articles articles) throws WeChatException{
		String media_id=null;
		String url = ADD_NEWS_URL + accessToken.token();
		String resultStr=HttpUtils.post(url, JSONObject.toJSONString(articles));
		JSONObject jsonObject = JSONObject.parseObject(resultStr);
		media_id =jsonObject.getString("media_id");
		return media_id;
	}
	
	/**
	 * 本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。
	 * 图片仅支持jpg/png格式，大小必须在1MB以下。
	 * @return
	 * @throws WeChatException 
	 * @throws IOException 
	 */
	public String uploadimg(String img) throws WeChatException, IOException{
		String imgurl=null;
		String posturl = UPLOADIMG_URL + accessToken.token();
		//byte[] data=HttpUtils.getFile(img);
		byte[] data=FileUtils.readFileToByteArray(new File("C:/0.jpg"));
		String result= HttpUtils.postFile(posturl, PARAM_FILE, data,"unnamed.jpg");//new File("C:/0.jpg")
		JSONObject jsonObject = JSONObject.parseObject(result);
		imgurl =jsonObject.getString("url");
		return imgurl;
	}
	/**
	 * 素材总数
	 * @return
	 */
	public Materialcount getMaterialcount() throws WeChatException{
		Materialcount materialcount=null;
		for(int i=0;i<retry;i++){
			String url = MATERIALCOUNT_URL + accessToken.token();
			String resultStr = HttpUtils.get(url);
			logger.debug("return data {}",resultStr);
			JSONObject jsonObject = JSONObject.parseObject(resultStr);
			int errCode =jsonObject.getIntValue("errcode");
			if(errCode==0){
				materialcount=JSONObject.parseObject(resultStr, Materialcount.class);
			}else if(WeChatUtil.isAccessTokenInvalid(errCode)){
				this.accessToken.refresh();
			}else{
				
			}
		}
		return materialcount;
	}
	/**
	 * 获取素材列表
	 * 	type 	是 	素材的类型，图片（image）、视频（video）、语音 （voice）、图文（news）
		offset 	是 	从全部素材的该偏移位置开始返回，0表示从第一个素材 返回
		count 	是 	返回素材的数量，取值在1到20之间 
	 * @throws WeChatException 
	 */
	public JSONObject list(String type,int offset,int count) throws WeChatException{
		JSONObject resultObject=null;
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("type", type);
		jsonObject.put("offset", offset);
		jsonObject.put("count", count);
		for(int i=0;i<retry;i++){
			String url = MATERIAL_LIST_URL + accessToken.token();
			String resultStr = HttpUtils.post(url, jsonObject.toJSONString(),Charset.forName("UTF-8"));
			logger.debug("return data "+resultStr);
			resultObject = JSONObject.parseObject(resultStr);
			int errCode =resultObject.getIntValue("errcode");
			if(errCode==0){
				
			}else if(WeChatUtil.isAccessTokenInvalid(errCode)){
				this.accessToken.refresh();
			}else{
				
			}
		}
		return resultObject;
	}
	int maxCount=20;
	/**
	 * 查询所有素材
	 * @throws WeChatException 
	 */
	public List<Map<String,Object>> allMaterial() throws Exception{
		List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
		Materialcount materialcount = getMaterialcount();
		int voice_count=materialcount.getVoice_count();
		int video_count=materialcount.getVideo_count();//	视频总数量
		int image_count=materialcount.getImage_count();//	图片总数量
		int news_count=materialcount.getNews_count();//	图文总数量
		String typeArray []={TYPE_IMAGE,TYPE_VIDEO,TYPE_VOICE,TYPE_NEWS};
		int typeCount []={image_count,video_count,voice_count,news_count};
		for(int j=0;j<4;j++){
			String type=typeArray[j];
			int count=typeCount[j];
			double d=(double)count/maxCount;
	        int forCount=(int)Math.ceil(d);
	        for(int k=0;k<forCount;k++){
	        	int offset=k*maxCount;
	        	JSONObject jsonObject=this.list(type, offset, maxCount);
	        	JSONArray jsonArray = jsonObject.getJSONArray("item");
				for(int i=0;i<jsonArray.size();i++){
					JSONObject item=jsonArray.getJSONObject(i);
					Map<String,Object> insert =new HashMap<String,Object>();
					String media_id=item.getString("media_id");
					String name=item.getString("name");
					String url=item.getString("url");
					Date update_time=new Date(1000L*item.getIntValue("update_time"));
					insert.put("type", type);
					insert.put("media_id", media_id);
					insert.put("name", name);
					insert.put("url", url);
					insert.put("update_time", update_time);
					if(type.equals(TYPE_NEWS)){
						JSONObject content = item.getJSONObject("content");
						insert.put("content", content.toJSONString());
						JSONArray newsArray=content.getJSONArray("news_item");
						//取第一个标题
						JSONObject news_item=newsArray.getJSONObject(0);
						String title=news_item.getString("title");
						insert.put("title", title);
					}
					list.add(insert);
				}
			}
		}
		return list;
	}
	
	public byte[] download(String media_id) throws WeChatException{
		return HttpUtils.getFile(new StringBuilder(DOWNLOAD_URL).append("access_token=").append(this.accessToken.token()).append("&media_id=").append(media_id).toString());
	}
	
}
